perm filename CARVEW.SAI[GEO,BGB] blob
sn#001270 filedate 1972-12-10 generic text, type T, neo UTF8
00100 BEGIN "CARVEW"
00200 DEFINE α = "COMMENT";
00300 α DISPLAY DECLARATION;
00400 INTEGER ARRAY DPYBUF [1:1000];
00500 REQUIRE "DISPLY[SYS,BGB]" LOAD_MODULE;
00600 EXTERNAL PROCEDURE DPYSET (INTEGER ARRAY DPYBUF);
00700 EXTERNAL PROCEDURE AIVECT (INTEGER X,Y);
00800 EXTERNAL PROCEDURE AVECT (INTEGER X,Y);
00900 EXTERNAL PROCEDURE DPYOUT (INTEGER POG);
01000 EXTERNAL PROCEDURE DPYSST (STRING S);
01100 INTEGER SFLG,CFLG,QFLG;
01200 α TRIG SUBR;
01300 REQUIRE "SAITRG[SYS,BGB]" LOAD_MODULE;
01400 EXTERNAL REAL PROCEDURE SQRT (REAL X);
01500 EXTERNAL REAL PROCEDURE SIN (REAL X);
01600 EXTERNAL REAL PROCEDURE COS (REAL X);
01700 α CLIPPER, ITS ARGS AND VALUES;
01800 REQUIRE "CLIPER[SYS,BGB]" LOAD_MODULE;
01900 EXTERNAL INTEGER PROCEDURE CLIPER;
02000 EXTERNAL INTEGER XL,XH,YL,YH;
02100 EXTERNAL REAL X1,Y1,Z1,X2,Y2,Z2;
02200 EXTERNAL INTEGER XX1,YY1,XX2,YY2;
02300 α TV RASTER PARAMETERS;
02400 INTEGER LDX,LDY,LDZ; α LOGICAL RASTER SIZE;
02500 REAL PDX,PDY; α PHYSICAL RASTER SIZE;
02600 EXTERNAL REAL FOCAL,SX,SY,SZ;
02700 α CAMERA ORIENTATION AND LOCATION;
02800 REAL IX,IY,IZ,JX,JY,JZ,KX,KY,KZ,DX,DY,DZ;
02900 REAL PAN,TILT;
03000 α CAMERA PRINCIPLE VECTOR;
03100 REAL CX1,CY1,CZ1,CX2,CY2,CZ2,R;
03200 α LOOP COUNTERS & FILE SIZES;
03300 INTEGER I,J,M,N;
00100 α RASTER INITIALIZATION;
00200 PDX ← 10.6/2;
00300 PDY ← 8.0/2;
00400 FOCAL ← 12.5;
00500 LDX ← 512;
00600 LDY ← 384;
00700 LDZ ← 1024;
00800 SX ← -FOCAL*LDX/PDX;
00900 SY ← -FOCAL*LDY/PDY;
01000 FOCAL ← FOCAL*3.2808@-3;
01100 SZ ← FOCAL*LDZ;
01200 XL ← -511; XH ← 511;
01300 YL ← -385; YH ← 384;
01400 α THE 511 AND DPY RASTER FRAMES;
01500 DPYSET (DPYBUF);
01600 AIVECT(-511,-511);
01700 AVECT ( 511,-511);
01800 AVECT ( 511, 511);
01900 AVECT (-511, 511);
02000 AVECT (-511,-511);
02100 AIVECT(XL,YL);
02200 AVECT(XH,YL);
02300 AVECT(XH,YH);
02400 AVECT(XL,YH);
02500 AVECT(XL,YL);
02600 DPYOUT(0);
02700 α FILE OPENING CEREMONIES;
02800 BEGIN "OPENER"
02900 LABEL L1,L2,L3;
03000 STRING STR;
03100 BOOLEAN FLG;
03200 OPEN(1,"DSK",8,2,0,0,0,0);
03300 L1: OUTSTR (".V3D COURSE FILE = ");
03400 STR ← INCHWL;
03500 LOOKUP(1,STR&".V3D",FLG);
03600 IF FLG THEN GO L1;
03700 OPEN(2,"DSK",8,2,0,0,0,0);
03800 L2: OUTSTR (".V3D ROAD FILE = ");
03900 STR ← INCHWL;
04000 LOOKUP(2,STR&".V3D",FLG);
04100 IF FLG THEN GO L2;
04200 OPEN(3,"DSK",8,2,0,0,0,0);
04300 L3: OUTSTR (".V3D AERIAL FILE = ");
04400 STR ← INCHWL;
04500 LOOKUP(3,STR&".V3D",FLG);
04600 IF FLG THEN GO L3;
04700 END "OPENER";
00100 α AERIAL VIEW;
00200 N ← WORDIN(3);
00300 BEGIN "AERIAL"
00400 REAL ARRAY ROAD [0:N,1:3];
00500 ARRYIN(3,ROAD[0,1],3*(N+1));
00600 RELEASE(3);
00700 DPYSET(DPYBUF);
00800 AIVECT (ROAD[0,1]*1.5,ROAD[0,2]*1.5);
00900 FOR I←1 STEP 1 UNTIL N DO
01000 AVECT (ROAD[I,1]*1.5,ROAD[I,2]*1.5);
01100 DPYOUT(1);
01200 END "AERIAL";
01300 N ← WORDIN(2);
01400 M ← WORDIN(1);
01500 BEGIN "DATA BLK"
01600 REAL ARRAY ROAD [0:N,1:3];
01700 REAL ARRAY COURSE [0:M,1:3];
01800 ARRYIN(2,ROAD[0,1],3*(N+1));
01900 RELEASE(2);
02000 ARRYIN(1,COURSE[0,1],3*(M+1));
02100 RELEASE(1);
02200 BEGIN "SUBR"
00100 α GET CAMERA LOCATION AND ORIENTATION;
00200 PROCEDURE CAMLOCOR;
00300 BEGIN "CAMERA"
00400 INTEGER OLDJ;
00500 REAL ST,CT,SP,CP;
00600 α CAMERA AT CX1 LOOKING TOWARDS CX2;
00700 IF OLDJ≠J THEN
00800 BEGIN
00900 OLDJ ← J;
01000 CX1 ← CX2;
01100 CY1 ← CY2;
01200 CZ1 ← CZ2;
01300 CX2 ← COURSE[J,1];
01400 CY2 ← COURSE[J,2];
01500 CZ2 ← COURSE[J,3];
01600 END;
01700 DX ← CX1 - CX2;
01800 DY ← CY1 - CY2;
01900 DZ ← CZ1 - CZ2;
02000 α PAN THE CAMERA;
02100 CP ← COS(PAN);
02200 SP ← SIN(PAN);
02300 DX ← CP*DX - SP*DY;
02400 DY ← CP*DY + SP*DX;
02500 α TILT THE CAMERA;
02600 CT ← COS(TILT);
02700 ST ← SIN(TILT);
02800 DZ ← CT*DZ - ST*DX;
02900 DX ← CT*DX + ST*DZ;
03000 R ← SQRT (DX↑2 + DY↑2 + DZ↑2);
03100 α PRINCIPLE AXIS;
03200 KX ← DX/R;
03300 KY ← DY/R;
03400 KZ ← DZ/R;
03500 α HORIZONTAL AXIS;
03600 IX ← -KY;
03700 IY ← KX;
03800 IZ ← 0 ;
03900 R ← SQRT (IX↑2 + IY↑2);
04000 IX ← IX/R;
04100 IY ← IY/R;
04200 α VERTICAL AXIS;
04300 JX ← KY*IZ - KZ*IY;
04400 JY ← KZ*IX - KX*IZ;
04500 JZ ← KX*IY - KY*IX;
04600 α DISPLAY THE CART ON THE AERIAL VIEW;
04700 DPYSET(DPYBUF);
04800 AIVECT(CX2*1.5,CY2*1.5);
04900 AVECT(CX1*1.5,CY1*1.5);
05000 DPYSST("CART");
05100 DPYOUT(3);
05200 END "CAMERA";
00100 α DISPLAY THE ROAD AS SEEN FROM THE CART'S CAMERA;
00200 PROCEDURE ROADPY;
00300 BEGIN "ROAD"
00400 CAMLOCOR;
00500 DPYSET (DPYBUF);
00600 FOR I←1 STEP 1 UNTIL N DO
00700 BEGIN
00800 REAL X,Y,Z;
00900 X1 ← X2;
01000 Y1 ← Y2;
01100 Z1 ← Z2;
01200
01300 X ← ROAD[I,1] - CX1;
01400 Y ← ROAD[I,2] - CY1;
01500 Z ← ROAD[I,3] - CZ1;
01600
01700 X2 ← IX*X + IY*Y + IZ*Z;
01800 Y2 ← JX*Y + JY*Y + JZ*Z;
01900 Z2 ← KX*Z + KY*Y + KZ*Z;
02000
02100 IF Z2 ≤ -FOCAL THEN
02200 BEGIN
02300 X2 ← SX*X2/Z2;
02400 Y2 ← SY*Y2/Z2;
02500 Z2 ← SZ /Z2;
02600 END ELSE
02700 BEGIN
02800 X2 ← X2;
02900 Y2 ← Y2;
03000 Z2 ← Z2 + FOCAL;
03100 END;
03200 CFLG ← CLIPER;
03300 IF CFLG<3 THEN
03400 BEGIN
03500 AIVECT(XX1,YY1);
03600 AVECT(XX2,YY2);
03700 END;
03800 END;
03900 DPYOUT(2);
04000 END "ROAD";
00100 α PROCESS COMMAND CHARACTER;
00200 PROCEDURE CAMCHR (INTEGER CHR);
00300 BEGIN "CAMCHR"
00400 LABEL L; REAL DEL;
00500 DEL ← 3.14159628 / 18;
00600 L: IF CHR="(" THEN PAN←PAN-DEL ELSE
00700 IF CHR=")" THEN PAN←PAN+DEL ELSE
00800 IF CHR=":" THEN TILT←TILT+DEL ELSE
00900 IF CHR=";" THEN TILT←TILT-DEL ;
01000 CAMLOCOR;
01100 ROADPY;
01200 CHR ← INCHRW;
01300 IF CHR≠'175 THEN GO L;
01400 END "CAMCHR";
00100 α INITIALIZATION;
00200 J ← 0;
00300 CX2 ← COURSE[0,1];
00400 CY2 ← COURSE[0,2];
00500 CZ2 ← COURSE[0,3];
00600 α MAIN LISTEN LOOP;
00700 WHILE TRUE DO
00800 BEGIN "LISTEN"
00900 INTEGER CHR;
01000 CHR ← INCHRS;
01100 IF CHR<0 THEN J← 1+ (J+1)MOD M ELSE CAMCHR(CHR);
01200 ROADPY;
01300 END "LISTEN";
01400 END "SUBR";
01500 END "DATA BLK";
01600 END "CARVEW"